/**
 * 
 */
package platzerworld.kegeln.db;

import java.util.List;

import platzerworld.kegeln.db.klasse.KlasseTbl;
import platzerworld.kegeln.db.mannschaft.MannschaftTbl;
import platzerworld.kegeln.db.spieler.SpielerTbl;
import platzerworld.kegelverwaltung.vo.KlasseTO;
import platzerworld.kegelverwaltung.vo.MannschaftTO;
import platzerworld.kegelverwaltung.vo.SpielerTO;
import android.content.Context;
import android.database.sqlite.SQLiteStatement;
import android.util.Log;


/**
 * Die Klasse dient als logische Verbindung zur Datenbank der Anwendung. Sie ist f�r die Erstellung und Wartung des Datenbankschemas 
 * sowie die Initialbef�llung der Tabellen verantwortlich.
 * 
 * Die Stammdaten werden �ber die Google App Engine Anwendung https://kegelverwaltung.appspot.com/ geliefert.
 * 
 * @author platzerg
 */
public class KegelverwaltungGAEDatenbank extends KegelverwaltungDatenbank {

	/** Markierung f�r Logging. */
	private static final String TAG = "KegelverwaltungGAEDatenbank";

	/**
	 * Die Datenbank kann nur nach Kenntnis "ihrer" Anwendung verwaltet werden.
	 * Daher muss der Context der Anwendung �bergeben werden.
	 * 
	 * @param context Context der aufrufenden Anwendung.
	 */
	public KegelverwaltungGAEDatenbank(Context context) {
		super(context);
	}
		

	/**
	 * Hier werden die Stammdaten f�r die Spielklassen erzeugt.
	 * 
	 * @param klassen die ermittelten Klassen aus GAE
	 * @param deleteOldData true dann werden bestehende Daten gel�scht
	 * 
	 */
	public void erzeugeKlassenDaten(List<KlasseTO> klassen, boolean deleteOldData) {
		try{
			 db = getWritableDatabase();
			 if(null != db){
				// loesche vorhandene daten
				if(deleteOldData){
					db.delete(KlasseTbl.TABLE_NAME, null, null);
				}

				final SQLiteStatement stmtInsertKlassen = db.compileStatement(KlasseTbl.STMT_KLASSE_INSERT_ALL_WITH_ID);

				db.beginTransaction();
				try {
					for (KlasseTO klasseTO : klassen) {
						stmtInsertKlassen.bindLong(1, klasseTO.key);
						stmtInsertKlassen.bindString(2, klasseTO.klasseId);
						stmtInsertKlassen.bindString(3, klasseTO.name);
						stmtInsertKlassen.bindString(4, klasseTO.schub);
						stmtInsertKlassen.executeInsert();
					}

					db.setTransactionSuccessful();
				} catch (Throwable ex) {
					Log.e(TAG, "Fehler beim Einf�gen eines Klassen-Datensatzes. " + ex);
				} finally {
					db.endTransaction();
				}
			 }
		} finally {
			db.close();
		}

	}

	/**
	 * Hier werden die Stammdaten f�r die Mannschaften erzeugt.
	 * 
	 * @param mannschaften die ermittelten Mannschaften aus GAE
	 * @param deleteOldData true dann werden bestehende Daten gel�scht
	 * 
	 */
	public void erzeugeMannschaftDaten(List<MannschaftTO> mannschaften, boolean deleteOldData) {
		try{
			db = getWritableDatabase();
			if(null != db){
				if(deleteOldData){
					db.delete(MannschaftTbl.TABLE_NAME, null, null);
				}

				final SQLiteStatement stmtInsertMannschaften = db.compileStatement(MannschaftTbl.STMT_MANNSCHAFT_INSERT_ALL_WIDTH_ID);

				db.beginTransaction();
				try {
					for (MannschaftTO mannschaftTO : mannschaften) {
						stmtInsertMannschaften.bindLong(1, mannschaftTO.id);
						stmtInsertMannschaften.bindString(2, mannschaftTO.name);
						stmtInsertMannschaften.bindLong(3, mannschaftTO.klasseId);
						stmtInsertMannschaften.bindLong(4, mannschaftTO.vereinId);
						stmtInsertMannschaften.bindLong(5, mannschaftTO.mannschaft);
						
						stmtInsertMannschaften.executeInsert();
					}

					db.setTransactionSuccessful();
				} catch (Throwable ex) {
					Log.e(TAG, "Fehler beim Einf�gen eines Mannschaft-Datensatzes. " + ex);
				} finally {
					db.endTransaction();
				}
			 }
		} finally {
			db.close();
		}
	}

	/**
	 * Hier werden die Stammdaten f�r die Spieler erzeugt.
	 * 
	 * @param spieler die ermittelten Spieler aus GAE
	 * @param deleteOldData true dann werden bestehende Daten gel�scht
	 * 
	 */
	public void erzeugeSpielerDaten(List<SpielerTO> spieler, boolean deleteOldData) {
		try{
			db = getWritableDatabase();
			if(null != db){
				if(deleteOldData){
						db.delete(SpielerTbl.TABLE_NAME, null, null);
				}

				final SQLiteStatement stmtInsertSpieler = db.compileStatement(SpielerTbl.STMT_SPIELER_INSERT_ALL_WITH_ID);

				db.beginTransaction();
				try {
					for (SpielerTO spielerTO : spieler) {						
						stmtInsertSpieler.bindLong(1, spielerTO.id);
						stmtInsertSpieler.bindLong(2, spielerTO.mannschaftId);
						stmtInsertSpieler.bindLong(3, spielerTO.aushelfermannschaftId);
						stmtInsertSpieler.bindLong(4, spielerTO.passNr);
						stmtInsertSpieler.bindString(5, spielerTO.name);
						stmtInsertSpieler.bindString(6, spielerTO.vorname== null ? "" : spielerTO.vorname);
						stmtInsertSpieler.bindString(7, spielerTO.gebDatum== null ? "" : spielerTO.gebDatum);
						stmtInsertSpieler.bindLong(8, (int) (spielerTO.latidute * 1E6));
						stmtInsertSpieler.bindLong(9, (int) (spielerTO.longitude * 1E6));
						stmtInsertSpieler.executeInsert();
					}

					db.setTransactionSuccessful();
				} catch (Throwable ex) {
					Log.e(TAG, "Fehler beim Einf�gen eines Spieler-Datensatzes. " + ex);
				} finally {
					db.endTransaction();
				}
			 }
		} finally {
			db.close();
		}
		
	}

}
